/**
 * 什么是动态资源:简单的理解就是，从数据库取出的信息渲染的页面,就可以称为动态页面（不是很严谨的说法）
 * 
 * 动态网页具体做了什么工作：1.从数据库取数据
 *                         2.处理数据
 *                         3.渲染到模板
 * 
 * 动态网页是需要传参数的：
 * 
 *                      怎么去获取参数？
 * 
 *                                     比方 http://localhost:8080/demo.html?page=1&condition=node
 * 
 *                                     url:http://localhost:8080/demo.html?page=1&condition=node
 * 
 *                                     uri:/demo.html?page=1&condition=node
 *                                      
 *                                     path:/demo.html(path 没固定格式, /demo)
 * 
 *                                     query:page=1&condition=node (我们就可以理解为是给数据参数提供的参数)
 * 
 * 
 *                       自建框架定义的动态url:
 * 
 *                                      http://localhost:8080/?c=index&a=index
 * 
 *                                      c是 controller 的简写
 * 
 *                                      a是 action //todo
 * 
 *                      mvc : 主要的流程就是 c 去指挥 modle 和 v view 
 * 
 * 
 * 
 * 
 * 
 */


 let http = require("http");
 let fs = require('fs');
 
 http.createServer(function (req, res) {
 
     let url = req.url;
     //静态资源, 还有不完善的地方,有些文件类似是用户不能访问,exe bat 是不能访问的....
     // 比方我们的 http//:localhost:8080/home/demo/demo.exe ,我们要对静态url的文件格式进行检测，比方 png gif css 我们就可以开放
     // exe bat  就不开放了...
     if(url.lastIndexOf(".")>-1){
         let path ='.'+url;//    /home/css/1.css，这种不是正确相对路径的表示加个 '.'
         console.log(path);
         //web服务器上的代码，一定要异步的
         fs.exists(path,function(result){
             if(!result){
                 path ='./home/imgs/404.png';
             }
             fs.readFile(path,function(err,data){
                 if(err){
                    res.end(err.message);
                 }else{
                     res.write(data);
                     res.end();
                 }
            })
           
         })
        
     }else{
         //动态资源，动态资源正常来说就是要找数据库
         //首先是定位到我们的 controller,通过 url的参数 c 比方说  http://localhost:8080/path?c=index&a=index
         //我们要获取到参数c 从而去定位到我们的controller(controller是指挥者,他是前置的)
         let url = req.url;// node http模块中的url 不是全路径的(http://localhost:8080/path?c=index&a=index)
                           //是 uri  /path?c=index&a=index 我们需要的是 query(c=index&a=index)
         let query = url.split('?')[1];//取出 c=index&a=index
        
         let queryArry= query.split('&');//得到数据 [c=index,a=index];

         let needArr =[];//把query参数构建成key val格式 如 c=index&a=index 构建成 [ c: 'index', a: 'index' ]
         for(let val in queryArry){
            let temArr = queryArry[val].split('=');
            needArr[temArr[0]]=temArr[1];
         }

         req.query = needArr;//我们后续可能还要从这个url中提取参数，先赋值到 req这个对象上
         
         //console.log(needArr);
         let controllerName = needArr['c'];
        
         //console.log('controller-----'+controllerName);

         //controller是mvc的指挥者,执行动态网页的逻辑所在，所以先查找controller

         let path = './home/controller/'+controllerName;//controller的路径地址

         let controller = require(path);//引入controller ,变量 controller 就是 引入的 Index(jason格式)

         let action = needArr['a'];//要执行的函数,action是个变量

         //如何去查找,要执行的函数?

         //controller.action();//虽然controller 是个json格式，
                             //但是 action 是个变量,json访问 key时，通过 . 的方式只能是常量,常量必须要json对象中you
                             controller[action](req);//动态获取,action是变量时，json对象通过 [变量名]    
        //函数传参有两种类型，一种是 引用类型，一种是 赋值类似, 如果传的是对象，在js 里面，是 引用类型的.                                  

         res.end();
     }
    
 
 }).listen(8080);

 //作业：实现动态网页，自己构建mvc目录，实现controller的查找，action 的执行
 